//
//  HMUserAccountViewModel.swift
//  iOSWeibo11
//
//  Created by Apple on 16/7/21.
//  Copyright © 2016年 Apple. All rights reserved.
//

import UIKit

/// 负责处理 HMUserAccount的业务逻辑
/// 网络请求
/// 字典转模型
/// 保存模型到沙盒中
/// 沙盒加载模型到内存中

class HMUserAccountViewModel: NSObject {
    
    /// 单例
    static let sharedUserAccountViewModel: HMUserAccountViewModel = HMUserAccountViewModel()
    
    /// userAccount,以后要访问账号只需要访问这个属性
    var userAccount: HMUserAccount?
    
    /// 用户是否登录的属性
    var userLogin: Bool {
        get {
            // 有账号表示登录
            return userAccount != nil
        }
    }
    
    /// 账号保存的路径
    let userAccountFile = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last!.stringByAppendingString("/userAccount.plist")
    
    override init() {
        // 读取沙盒中的账号
        super.init()
        
        userAccount = loadAccount()
    }
    
    /// 获取用户名称和头像
    func loadUserInfo(completion: (error: NSError?) -> ()) {
//        if let access_token = userAccount?.access_token {
//            // access_token有值
//            if let uid = userAccount?.uid {
//                // uid 有值
//                if let a = a {
//                    if let b = b {
//                        
//                    }
//                }
//            }
//        }
        
//        if let access_token = userAccount?.access_token {
//            // 有值才进来,access_token只能在这个里面使用
//        }
        
        
        // 过多的if let 会造成嵌套太多可以使用守卫
        guard let access_token = userAccount?.access_token else {
            // 没有值才进来
            print("没有access_token,不发网络请求")
            return
        }
        
        guard let uid = userAccount?.uid else {
            // 没有值才进来
            print("没有uid,不发网络请求")
            return
        }
        
        // access_token 和 uid 都有值
        
        // 后面可以一直使用access_token
        
        // urlString
        let urlString = "2/users/show.json"
        
        // 参数
        let parameters = [
            "access_token": access_token,
            "uid": uid
        ]
        
        // 发送请求
        HMNetworkTool.sharedNetworkTool.requestGET(urlString, parameters: parameters, progress: nil, success: { (_, responseObjce) -> Void in
            // 获取用户名称和头像地址
            let dict = responseObjce as? [String: AnyObject]
            let screen_name = dict?["screen_name"] as? String
            let avatar_large = dict?["avatar_large"] as? String
            
            // 给userAccount赋值
            self.userAccount?.screen_name = screen_name
            self.userAccount?.avatar_large = avatar_large
            
            // 将模型重新保存到沙盒中
            self.saveUserAccount(self.userAccount!)
            
            // 告诉调用的人获取到了数据
            completion(error: nil)
            }) { (_, error) -> Void in
                print("请求用户数据失败: \(error)")
                // 告诉调用的人获取数据失败了
                completion(error: error)
        }
    }
    
    /**
     去服务器请求AccessToken
     
     - parameter code: code
     */
    func loadAccessToken(code: String, completion: (error: NSError?) -> Void) {
        let urlString = "https://api.weibo.com/oauth2/access_token"
        
        // 参数
        let parameters = [
            "client_id": client_id,
            "client_secret": client_secret,
            "grant_type": "authorization_code",
            "code": code,
            "redirect_uri": redirect_uri
        ]
        
        // 使用AFN发送POST请求
        HMNetworkTool.sharedNetworkTool.requestPOST(urlString, parameters: parameters, progress: nil, success: { (_, resopnseOjbect) -> Void in
//            print("resopnseOjbect: \(resopnseOjbect)")
            
            // 字典转模型
            let dict = resopnseOjbect as! [String: AnyObject]
            self.userAccount = HMUserAccount(dict: dict)
            
            print("userAccount = \(self.userAccount)")
            
            // 保存到沙盒中
            self.saveUserAccount(self.userAccount!)
            
            // 回调
//            completion(error: NSError(domain: "aaa", code: 10000, userInfo: ["a": "a"]))
            completion(error: nil)
            }) { (_, error) -> Void in
                completion(error: error)
        }
    }
    
    /// 保存模型到沙盒中
    private func saveUserAccount(userAccount: HMUserAccount) {
         NSKeyedArchiver.archiveRootObject(userAccount, toFile: self.userAccountFile)
    }
    
    /// 加载沙盒中的账号
    private func loadAccount() -> HMUserAccount? {
        let account = NSKeyedUnarchiver.unarchiveObjectWithFile(userAccountFile) as? HMUserAccount
        
        // 如果有账号需要判断是否过期
        // NSDate(): 当前时间
        // account?.expiresDate 2021
        // NSDate(): 2016
        // 2021 > 2016
        // 测试过期时间
//        account?.expiresDate = NSDate(timeIntervalSinceNow: -100)
        if account != nil && account?.expiresDate?.compare(NSDate()) == NSComparisonResult.OrderedDescending {
            print("没有过期的账号")
            return account
        }
        
        return nil
    }
}
